<?php
/**
 *
 * 权限验证
 *
 */
namespace app\admin\middleware;

use app\admin\service\auth\AdminService;
use think\exception\HttpResponseException;
use think\facade\Request;
use think\Response;

class CheckAuth
{
    public function handle($request, \Closure $next){

        // 拼接控制器和方法，如：index/index
        $route = Request::controller(true) . '/' . Request::action();
        $route = strtolower($route);    // 转为小写。

        $adminService = new AdminService();

        // 验证当前用户权限
        if (!$adminService->checkLoginAuth($route)){
            return $this->error('您无此操作权限!');
        }

        // 中间件handle方法的返回值必须是一个Response对象。
        return $next($request);
    }

    /**
     * 操作错误跳转
     * @param  mixed $msg 提示信息
     * @param  string $url 跳转的URL地址
     * @param  mixed $data 返回的数据
     * @param  integer $wait 跳转等待时间
     * @param  array $header 发送的Header信息
     * @return void
     */
    protected function error($msg = '', string $url = null, $data = '', int $wait = 3, array $header = []): Response
    {
        if (is_null($url)) {
            $url = request()->isAjax() ? '' : 'javascript:history.back(-1);';
        } elseif ($url) {
            $url = (strpos($url, '://') || 0 === strpos($url, '/')) ? $url : app('route')->buildUrl($url);
        }

        $result = [
            'error' => 1,
            'msg' => $msg,
            'data' => $data,
            'url' => $url,
            'wait' => $wait,
        ];

        $type = (request()->isJson() || request()->isAjax()) ? 'json' : 'html';

        // 所有form返回的都必须是json，所有A链接返回的都必须是Html
        $type = request()->isGet() ? 'html' : $type;

        if ($type == 'html') {
            $response = view(app('config')->get('app.dispatch_error_tmpl'), $result);
        } else if ($type == 'json') {
            $response = json($result);
        }
        throw new HttpResponseException($response);
    }
}
